#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;

int a,b;
int res,minx,sq;
char map[30][30];
vector<string> v;
string reverse(string &s)
{
    string st;
    st="";
    for(int i=s.size()-1;i>=0;i--) st+=s[i];
    return st;
}
bool exist(string s)
{
    for(int i=0;i<v.size();i++) if(v[i]==s) return true;
    return false;
}
bool same(int sx,int sy,int x,int y)
{
    string s1,s2;
   // printf("[%d,%d] %d %d\n",sx,sy,x,y);
    s1="";
    for(int i=0;i<x;i++)
        for(int j=0;j<y;j++) s1+=map[sx+i][sy+j];
    if(exist(s1)) return true;
    if(exist(reverse(s1))) return true;
    if(x==y)
    {
        for(int j=y-1;j>=0;j--)
            for(int i=0;i<x;i++) s2+=map[sx+i][sy+j];
        if(exist(s2)) return true;
        if(exist(reverse(s2))) return true;
        v.push_back(s2);
        v.push_back(reverse(s2));
    }
    v.push_back(s1);
    v.push_back(reverse(s1));
    return false;
}
bool legal(int x,int y)
{
    v.clear();
    for(int i=0;i<a;i+=x)
        for(int j=0;j<b;j+=y)
        {
            if(same(i,j,x,y)) return false;
        }
    return true;
}
int main()
{
    while(cin>>a>>b)
    {
        sq=a*b;
        minx=a;
        res=0;
        for(int i=0;i<a;i++)
            for(int j=0;j<b;j++) cin>>map[i][j];
        for(int i=1;i<=a;i++) if(a%i==0)
            for(int j=1;j<=b;j++) if(b%j==0)
            {
                if(legal(i,j))
                {
                   // cout<<i<<" "<<j<<endl;
                    res++;
                    if(i*j<sq) sq=i*j,minx=i;
                    else if(i*j==sq&&i<minx) minx=i;
                }
            }
        cout<<res<<endl;
        cout<<minx<<" "<<sq/minx<<endl;
    }
    return 0;
}

